/* 
  对 axios 进行二次包装
    1、配置通用的基础路径和超时
    2、显示请求进度条
    3、成功返回的数据不再是 response,而直接是响应体数据 response.data
    4、统一处理请求错误,具体请求也可以选择处理或不处理
*/
import axios from "axios";
// 进度条
import NProgress from "nprogress";
import 'nprogress/nprogress.css'
// 临时用户登录ID
import store from '@/store'

// 配置通用的基础路径和超时
// service 是一个能发任意 ajax 请求的函数,当然可以作为对象使用
const service = axios.create({
  // 基础路径
  baseURL: '/api',
  // 超时时间
  timeout: 20000
})

// 添加请求拦截器
service.interceptors.request.use(config => {
  // 显示请求进度条,在请求拦截器中
  NProgress.start()

  // 临时用户登录 ID,放到每次请求的请求头中
  let userTempId = store.state.user.userTempId
  if (userTempId) {
    config.headers.userTempId = userTempId
  }

  // 携带登录后标识 token
  let token = store.state.user.token
  if (token) {
    config.headers.token = token
  }

  // 必须返回 config
  return config // 后面就会根据返回的 config,使用 xhr 对象发 ajax 请求
})

// 添加响应拦截器
service.interceptors.response.use(
  // 请求成功返回的回调
  response => {
    // 隐藏请求进度条,在响应拦截器中
    NProgress.done()
    // 成功返回的数据不再是 response, 而直接是响应体数据 response.data
    return response.data
  },
  // 请求失败返回的回调
  error => {
    // 隐藏请求进度条,在响应拦截器中
    NProgress.done()

    // 统一处理请求错误, 具体请求也可以选择处理或不处理
    alert(error.message || '未知的请求错误')
    // throw error
    return Promise.reject(error)
  })

// 向外暴露 service
export default service